package com.thread.Concurrent;
/*
并发：同一个对象被多线程同时操作（修改）：同一、多个、同时
对象的等待池的引入：排队
队列和锁：
1、解决排队
2、锁：排队的安全
3、锁机制： synchronized ：当一个线程获得对象排他锁，独占资源，其他线程等待，使用后，释放锁，其他线程才能再使用
线程同步的安全性：队列+锁
 */

//不安全的买票
//线程不安全，有负数出现
public class TestConcurrent {
    public static void main(String[] args) {
        BuyTicket buyTicket = new BuyTicket();
        new Thread(buyTicket,"刘备").start();
        new Thread(buyTicket,"关羽").start();
        new Thread(buyTicket,"张飞").start();
    }

}

//买票
class BuyTicket implements Runnable{
    private int ticket = 10;
    boolean flag = true;//停止循环
    @Override
    public void run() {//买票
        while (flag){
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
    private void buy() throws InterruptedException {
        //判断是否有票
        if(ticket <=0){
            flag = false;
            return;
        }
        //模拟延时
        Thread.sleep(100);
        //买到票
        System.out.println(Thread.currentThread().getName()+"拿到"+ticket--);
    }
}